package daos;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

import datos.Automovil;
import datos.Oferta;
import datos.Subasta;
import datos.TipoSubasta;
import datos.Usuario;
import dtos.ResumenOfertaDTO;
import dtos.ResumenSubastaDTO;
import dtos.ResumenMisSubastasDTO;

/**
 * Session Bean implementation class SubastaDAO
 * 
 * @version 1.0
 * @author Andres Mejia -Fabio Giraldo
 * 
 * @param Subasta hace referencia a la entidad que va hacer manejada por el DAO.
 * @param Integer especifica cual es el tipo de dato de la llave primaria de la entidad. 
 * 
 */
@Stateless
@LocalBean
public class SubastaDAO extends DAO<Subasta, Integer> {

    /**
     * Default constructor. 
     */
    public SubastaDAO() {
        // TODO Auto-generated constructor stub
    }

	@Override
	protected Class<Subasta> getEntityClass() {
		return Subasta.class;
	}
	
	/**
	 * @param precioBase Corresponde al valor que se necesita comparar las subastas
	 * @return query.getResultList() Retorna la lista de subasta con un precioBase mayor al solicitado.
	 */
	public List<Subasta> subastaPrecio(double precioBase)
	{
		Query query = entityManager
		.createQuery("select s from Subasta s where s.precioBase>=:atributo");
		query.setParameter("atributo",	 precioBase);
		query = query.setMaxResults(2);
		return query.getResultList();
	}
	
	/**
	 * 
	 * @param id
	 * @return
	 */
	public String[][]OfertasSubastas(int id)
	{
		Query query = entityManager.createQuery
		("select new dtos.ResumenOfertaDTO(oferta.usuario.cedula, oferta.valorOfertado, oferta.fecha.dia, oferta.fecha.mes, oferta.fecha.anio) from Subasta subasta LEFT JOIN subasta.ofertas oferta WHERE subasta.identificacion=:parametro" );
		query.setParameter("parametro", id);
		List<ResumenOfertaDTO> ofertas=query.getResultList();
		
		String[][] resumen=new String[ofertas.size()][3];
		
		for (int i = 0; i < resumen.length; i++) {
			
				resumen[i][0]=""+ofertas.get(i).getIdOfertante();
				resumen[i][1]=""+ofertas.get(i).getValorOfertado();
				resumen[i][2]=ofertas.get(i).getDia()+"/"+ofertas.get(i).getMes()+"/"+ofertas.get(i).getAnio();
		}
		
		return resumen;
	}
	
	public List<Usuario>UsuariosSubastas()
	{
		Query query = entityManager
		.createQuery("select DISTINCT subasta.usuario from Subasta subasta" );
		return query.getResultList();
	}
	/**
	 * 
	 * @param precio
	 * @param modelo
	 * @return 
	 */
	public String[][]subastaPrecioModelo(double precio,String modelo )
	{
		Query query=entityManager
		.createQuery("select new dtos.ResumenSubastaDTO(subasta.identificacion, subasta.fechaFin.dia, subasta.fechaFin.mes, subasta.fechaFin.anio, subasta.usuario.nombre, subasta.precioBase, subasta.automovil.modelo.marca.nombre, subasta.automovil.modelo.nombre, subasta.automovil.placa) from Subasta subasta where subasta.precioBase>=:parametro and subasta.automovil.modelo.nombre=:parametro1" );
		query.setParameter("parametro", precio);
		query.setParameter("parametro1", modelo);

		List<ResumenSubastaDTO> subastas=query.getResultList();
		
		String[][] resumen=new String[subastas.size()][7];
		System.out.println("en dao   "+resumen.length);
		for (int i = 0; i < resumen.length; i++) {
			
				resumen[i][0]=""+subastas.get(i).getId();
				resumen[i][1]=""+subastas.get(i).getPreciobase();
				resumen[i][2]=subastas.get(i).getPlacaAutomovil();
				resumen[i][3]=subastas.get(i).getMarcaAutomovil();
				resumen[i][4]=subastas.get(i).getModeloAutomovil();
				resumen[i][5]=subastas.get(i).getVendedor();
				resumen[i][6]=subastas.get(i).getDia()+"/"+subastas.get(i).getMes()+"/"+subastas.get(i).getAnio();
				
		}
		
		return resumen;
		
	}
	
	public TipoSubasta tipoSubasta(Subasta subasta1)
	{
		Query query = entityManager.createQuery
		("select tipo from TipoSubasta tipo, Subasta subasta where subasta=:parametro and subasta MEMBER OF tipo.subastas");
		query.setParameter("parametro", subasta1);
		return (TipoSubasta)query.getSingleResult();
	}
	
	public List<Automovil> AutomovilPorModelo(String modelo1,String modelo2, String modelo3)
	{
		Query query = entityManager.createQuery
		("select auto from Automovil auto where auto.modelo.nombre IN (:parametro1,:parametro2,:parametro3)");
		query.setParameter("parametro1", modelo1);
		query.setParameter("parametro2", modelo2);
		query.setParameter("parametro3", modelo3);
		return query.getResultList();
	}
	
//	public List<Subasta>AutosPorPrecio(double precio1, double precio2)
//	{
//		Query query = entityManager
//		.createQuery("select subasta from Subasta subasta where subasta.precioBase BETWEEN :parametro1 and :parametro2");
//		query.setParameter("parametro1", precio1);
//		query.setParameter("parametro2", precio2);
//		
//		return query.getResultList();
//	}
	public String[][]AutosPorPrecio(double precio1, double precio2)
	{
		Query query = entityManager
		.createQuery("select new dtos.ResumenSubastaDTO(subasta.identificacion, subasta.fechaFin.dia, subasta.fechaFin.mes, subasta.fechaFin.anio, subasta.usuario.nombre, subasta.precioBase, subasta.automovil.modelo.marca.nombre, subasta.automovil.modelo.nombre, subasta.automovil.placa) from Subasta subasta where subasta.precioBase BETWEEN :parametro1 and :parametro2");
		query.setParameter("parametro1", precio1);
		query.setParameter("parametro2", precio2);
		
		List<ResumenSubastaDTO> subastas=query.getResultList();
		
		String[][] resumen=new String[subastas.size()][7];
		
		for (int i = 0; i < resumen.length; i++) {
			
				resumen[i][0]=""+subastas.get(i).getId();
				resumen[i][1]=""+subastas.get(i).getPreciobase();
				resumen[i][2]=subastas.get(i).getPlacaAutomovil();
				resumen[i][3]=subastas.get(i).getMarcaAutomovil();
				resumen[i][4]=subastas.get(i).getModeloAutomovil();
				resumen[i][5]=subastas.get(i).getVendedor();
				resumen[i][6]=subastas.get(i).getDia()+"/"+subastas.get(i).getMes()+"/"+subastas.get(i).getAnio();
				
		}
		
		return resumen;
	}
	/**
	 * 
	 * @param id
	 * @return
	 */
	public String ofertaMax(int id)
	{
		Query query = entityManager
		.createQuery("select MAX(oferta.valorOfertado) from Subasta subasta INNER JOIN subasta.ofertas oferta WHERE  subasta.identificacion=:parametro" );
		query.setParameter("parametro", id);
		return ""+query.getSingleResult();
		
	}
	
	public String promedioOfertasSubasta(int id)
	{
		Query query = entityManager
		.createQuery("select AVG(oferta.valorOfertado) from Subasta subasta INNER JOIN subasta.ofertas oferta WHERE  subasta.identificacion=:parametro" );
		query.setParameter("parametro", id);
		return ""+query.getSingleResult();
	}
	
	public List<Subasta>ordenSubastaPrecio()
	{
		Query query = entityManager
		.createQuery("select subasta from Subasta subasta ORDER BY subasta.precioBase");
		return query.getResultList();
	}
	/**
	 * 
	 * @param id
	 * @return
	 */
	public String[][] subastasUsuario(String id)
	{
		Query query = entityManager
		.createQuery("select new dtos.ResumenMisSubastasDTO(subasta.identificacion, subasta.automovil.placa, subasta.precioBase, subasta.tipoSubasta.descripcion, subasta.fechaFin.dia, subasta.fechaFin.mes, subasta.fechaFin.anio) from Subasta subasta WHERE  subasta.usuario.cedula=:parametro");
		query.setParameter("parametro", id);
		
		List<ResumenMisSubastasDTO> subastas=query.getResultList();
		
		String[][] resumen=new String[subastas.size()][7];
		
		for (int i = 0; i < resumen.length; i++) {
			
				resumen[i][0]=""+subastas.get(i).getIdentificacion();
				resumen[i][1]=subastas.get(i).getPlaca();
				resumen[i][2]=""+subastas.get(i).getPrecioBase();
				resumen[i][3]=subastas.get(i).getTipoSubasta();
				resumen[i][4]=subastas.get(i).getDia()+"/"+subastas.get(i).getMes()+"/"+subastas.get(i).getAnio();
				resumen[i][5]=promedioOfertasSubasta(subastas.get(i).getIdentificacion());
				resumen[i][6]=ofertaMax(subastas.get(i).getIdentificacion());
				
		}
		
		return resumen;
	}

}
